﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Sauces.Bussinees.Entities.Ventas;
using Sauces.Repository.Ventas.Service;
using System.Data;

namespace Sauces.Repository.Ventas
{
    public class NotaPedidoRepository:MasterRepository,INotaPedidoRepository
    {

        public List<NotaPedido> GetAllFromNotaPedido()
        {
            var query = from p in Context.NotaPedido
                           select p;

            return query.ToList();
        }

        

        public NotaPedido GetAllFromNotaPedidoByNumero(int numero)
        {
            var query = from p in Context.NotaPedido.Include("DetalleNotaPedido.Producto")
                        where p.Id.Equals(numero)
                        select p;
            return query.SingleOrDefault();

        }

        public void addNotaPedido(NotaPedido pedido)
        {           

            foreach (var detalle in pedido.DetalleNotaPedido)
            {
                Context.Entry(detalle.Producto).State = EntityState.Unchanged;

            }
            Context.NotaPedido.Add(pedido);
            Context.SaveChanges();      
        }

        public void upDateNotaPedido(NotaPedido pedido)
        {
            var pedidoDB = GetAllFromNotaPedidoById(pedido.Id);

            pedidoDB.Fecha = pedido.Fecha;
            pedidoDB.Total = pedido.Total;            

            var DetallesEliminados = new List<DetalleNotaPedido>();

            foreach (var detalleDB in pedidoDB.DetalleNotaPedido)
            {
                var eliminado = pedido.DetalleNotaPedido.Where(dp => dp.item == detalleDB.item).SingleOrDefault();

                if (eliminado == null)
                {
                    DetallesEliminados.Add(detalleDB);
                }

            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = pedidoDB.DetalleNotaPedido.Where(dp => dp.item == detEliminado.item).SingleOrDefault();
                pedidoDB.DetalleNotaPedido.Remove(eliminar);

            }

            foreach (var detalle in pedido.DetalleNotaPedido)
            {
                if (detalle.item == 0)
                {
                    Context.Entry(detalle.Producto).State = EntityState.Unchanged;
                    pedidoDB.DetalleNotaPedido.Add(detalle);
                }

                else
                {
                    var detalleDB = pedidoDB.DetalleNotaPedido.Where(dp => dp.item == detalle.item).SingleOrDefault();
                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.Precio = detalle.Precio;

                    Context.Entry(detalleDB.Producto).State = EntityState.Unchanged;
                    Context.Entry(detalleDB).State = EntityState.Modified;
                }

            }
            Context.Entry(pedidoDB).State = EntityState.Modified;
            Context.SaveChanges();

            
        }

        public void removeNotaPedido(int id)
        {
            var pedido = GetAllFromNotaPedidoById(id);

            Context.NotaPedido.Remove(pedido);
            Context.SaveChanges();
        }

        public NotaPedido GetAllFromNotaPedidoById(int id)
        {
            var query = from p in Context.NotaPedido
                            .Include("DetalleNotaPedido.Producto")
                        where p.Id.Equals(id)
                        select p;

            return query.SingleOrDefault();
        }


        public List<NotaPedido> getAllNotaPedidoByNumeroAndFechas(int? numero, DateTime? FInicio, DateTime? FFin)
        {
            var query = from p in Context.NotaPedido
                        select p;

            if (numero.HasValue)
            {
                query = from c in query
                        where c.Id.Equals(numero.Value)
                        select c;
            }

            else if (FInicio.HasValue && FFin.HasValue)
            {
                query = from p in query
                        where p.Fecha >= FInicio && p.Fecha <= FFin
                        select p;
            }


            return query.ToList();
        }
    }
}
